//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS Amplify service.
///
/// Amplify enables developers to develop and deploy cloud-powered mobile and web apps. Amplify Hosting provides a continuous delivery and hosting service for web applications. For more information, see the Amplify Hosting User Guide. The Amplify Framework is a comprehensive set of SDKs, libraries, tools, and documentation for client app development. For more information, see the Amplify Framework.
public struct Amplify: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the Amplify client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            serviceName: "Amplify",
            serviceIdentifier: "amplify",
            serviceProtocol: .restjson,
            apiVersion: "2017-07-25",
            endpoint: endpoint,
            errorType: AmplifyErrorType.self,
            xmlNamespace: "http://amplify.amazonaws.com",
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }





    // MARK: API Calls

    /// Creates a new Amplify app.
    @Sendable
    @inlinable
    public func createApp(_ input: CreateAppRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateAppResult {
        try await self.client.execute(
            operation: "CreateApp", 
            path: "/apps", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new Amplify app.
    ///
    /// Parameters:
    ///   - accessToken: The personal access token for a GitHub repository for an Amplify app. The personal access token is used to authorize access to a GitHub repository using the Amplify GitHub App. The token is not stored. Use accessToken for GitHub repositories only. To authorize access to a repository provider such as Bitbucket or CodeCommit, use oauthToken. You must specify either accessToken or oauthToken when you create a new app. Existing Amplify apps deployed from a GitHub repository using OAuth continue to work with CI/CD. However, we strongly recommend that you migrate these apps to use the GitHub App. For more information, see Migrating an existing OAuth app to the Amplify GitHub App in the Amplify User Guide .
    ///   - autoBranchCreationConfig: The automated branch creation configuration for an Amplify app.
    ///   - autoBranchCreationPatterns: The automated branch creation glob patterns for an Amplify app.
    ///   - basicAuthCredentials: The credentials for basic authorization for an Amplify app. You must base64-encode the authorization credentials and provide them in the format user:password.
    ///   - buildSpec: The build specification (build spec) for an Amplify app.
    ///   - cacheConfig: The cache configuration for the Amplify app.
    ///   - computeRoleArn: The Amazon Resource Name (ARN) of the IAM role to assign to an SSR app. The SSR Compute role allows the Amplify Hosting compute service to securely access specific Amazon Web Services resources based on the role's permissions. For more information about the SSR Compute role, see Adding an SSR Compute role in the Amplify User Guide.
    ///   - customHeaders: The custom HTTP headers for an Amplify app.
    ///   - customRules: The custom rewrite and redirect rules for an Amplify app.
    ///   - description: The description of the Amplify app.
    ///   - enableAutoBranchCreation: Enables automated branch creation for an Amplify app.
    ///   - enableBasicAuth: Enables basic authorization for an Amplify app. This will apply to all branches that are part of this app.
    ///   - enableBranchAutoBuild: Enables the auto building of branches for an Amplify app.
    ///   - enableBranchAutoDeletion: Automatically disconnects a branch in the Amplify console when you delete a branch from your Git repository.
    ///   - environmentVariables: The environment variables map for an Amplify app.  For a list of the environment variables that are accessible to Amplify by default, see Amplify Environment variables in the Amplify Hosting User Guide.
    ///   - iamServiceRoleArn: The Amazon Resource Name (ARN) of the IAM service role for the Amplify app.
    ///   - jobConfig: Describes the configuration details that apply to the jobs for an Amplify app.
    ///   - name: The name of the Amplify app.
    ///   - oauthToken: The OAuth token for a third-party source control system for an Amplify app. The OAuth token is used to create a webhook and a read-only deploy key using SSH cloning. The OAuth token is not stored. Use oauthToken for repository providers other than GitHub, such as Bitbucket or CodeCommit. To authorize access to GitHub as your repository provider, use accessToken. You must specify either oauthToken or accessToken when you create a new app. Existing Amplify apps deployed from a GitHub repository using OAuth continue to work with CI/CD. However, we strongly recommend that you migrate these apps to use the GitHub App. For more information, see Migrating an existing OAuth app to the Amplify GitHub App in the Amplify User Guide .
    ///   - platform: The platform for the Amplify app. For a static app, set the platform type to WEB. For a dynamic server-side rendered (SSR) app, set the platform type to WEB_COMPUTE. For an app requiring Amplify Hosting's original SSR support only, set the platform type to WEB_DYNAMIC. If you are deploying an SSG only app with Next.js version 14 or later, you must set the platform type to WEB_COMPUTE and set the artifacts baseDirectory to .next in the application's build settings. For an example of the build specification settings, see Amplify build settings for a Next.js 14 SSG application in the Amplify Hosting User Guide.
    ///   - repository: The Git repository for the Amplify app.
    ///   - tags: The tag for an Amplify app.
    ///   - logger: Logger use during operation
    @inlinable
    public func createApp(
        accessToken: String? = nil,
        autoBranchCreationConfig: AutoBranchCreationConfig? = nil,
        autoBranchCreationPatterns: [String]? = nil,
        basicAuthCredentials: String? = nil,
        buildSpec: String? = nil,
        cacheConfig: CacheConfig? = nil,
        computeRoleArn: String? = nil,
        customHeaders: String? = nil,
        customRules: [CustomRule]? = nil,
        description: String? = nil,
        enableAutoBranchCreation: Bool? = nil,
        enableBasicAuth: Bool? = nil,
        enableBranchAutoBuild: Bool? = nil,
        enableBranchAutoDeletion: Bool? = nil,
        environmentVariables: [String: String]? = nil,
        iamServiceRoleArn: String? = nil,
        jobConfig: JobConfig? = nil,
        name: String,
        oauthToken: String? = nil,
        platform: Platform? = nil,
        repository: String? = nil,
        tags: [String: String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateAppResult {
        let input = CreateAppRequest(
            accessToken: accessToken, 
            autoBranchCreationConfig: autoBranchCreationConfig, 
            autoBranchCreationPatterns: autoBranchCreationPatterns, 
            basicAuthCredentials: basicAuthCredentials, 
            buildSpec: buildSpec, 
            cacheConfig: cacheConfig, 
            computeRoleArn: computeRoleArn, 
            customHeaders: customHeaders, 
            customRules: customRules, 
            description: description, 
            enableAutoBranchCreation: enableAutoBranchCreation, 
            enableBasicAuth: enableBasicAuth, 
            enableBranchAutoBuild: enableBranchAutoBuild, 
            enableBranchAutoDeletion: enableBranchAutoDeletion, 
            environmentVariables: environmentVariables, 
            iamServiceRoleArn: iamServiceRoleArn, 
            jobConfig: jobConfig, 
            name: name, 
            oauthToken: oauthToken, 
            platform: platform, 
            repository: repository, 
            tags: tags
        )
        return try await self.createApp(input, logger: logger)
    }

    /// Creates a new backend environment for an Amplify app.  This API is available only to Amplify Gen 1 applications where the backend is created using Amplify Studio or the Amplify command line interface (CLI). This API isn’t available to Amplify Gen 2 applications. When you deploy an application with Amplify Gen 2, you provision the app's backend infrastructure using Typescript code.
    @Sendable
    @inlinable
    public func createBackendEnvironment(_ input: CreateBackendEnvironmentRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateBackendEnvironmentResult {
        try await self.client.execute(
            operation: "CreateBackendEnvironment", 
            path: "/apps/{appId}/backendenvironments", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new backend environment for an Amplify app.  This API is available only to Amplify Gen 1 applications where the backend is created using Amplify Studio or the Amplify command line interface (CLI). This API isn’t available to Amplify Gen 2 applications. When you deploy an application with Amplify Gen 2, you provision the app's backend infrastructure using Typescript code.
    ///
    /// Parameters:
    ///   - appId: The unique ID for an Amplify app.
    ///   - deploymentArtifacts: The name of deployment artifacts.
    ///   - environmentName: The name for the backend environment.
    ///   - stackName: The AWS CloudFormation stack name of a backend environment.
    ///   - logger: Logger use during operation
    @inlinable
    public func createBackendEnvironment(
        appId: String,
        deploymentArtifacts: String? = nil,
        environmentName: String,
        stackName: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateBackendEnvironmentResult {
        let input = CreateBackendEnvironmentRequest(
            appId: appId, 
            deploymentArtifacts: deploymentArtifacts, 
            environmentName: environmentName, 
            stackName: stackName
        )
        return try await self.createBackendEnvironment(input, logger: logger)
    }

    ///  Creates a new branch for an Amplify app.
    @Sendable
    @inlinable
    public func createBranch(_ input: CreateBranchRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateBranchResult {
        try await self.client.execute(
            operation: "CreateBranch", 
            path: "/apps/{appId}/branches", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Creates a new branch for an Amplify app.
    ///
    /// Parameters:
    ///   - appId:  The unique ID for an Amplify app.
    ///   - backend: The backend for a Branch of an Amplify app. Use for a backend created from an CloudFormation stack. This field is available to Amplify Gen 2 apps only. When you deploy an application with Amplify Gen 2, you provision the app's backend infrastructure using Typescript code.
    ///   - backendEnvironmentArn: The Amazon Resource Name (ARN) for a backend environment that is part of a Gen 1 Amplify app.  This field is available to Amplify Gen 1 apps only where the backend is created using Amplify Studio or the Amplify command line interface (CLI).
    ///   - basicAuthCredentials:  The basic authorization credentials for the branch. You must base64-encode the authorization credentials and provide them in the format user:password.
    ///   - branchName: The name for the branch.
    ///   - buildSpec:  The build specification (build spec) for the branch.
    ///   - computeRoleArn: The Amazon Resource Name (ARN) of the IAM role to assign to a branch of an SSR app. The SSR Compute role allows the Amplify Hosting compute service to securely access specific Amazon Web Services resources based on the role's permissions. For more information about the SSR Compute role, see Adding an SSR Compute role in the Amplify User Guide.
    ///   - description: The description for the branch.
    ///   - displayName:  The display name for a branch. This is used as the default domain prefix.
    ///   - enableAutoBuild:  Enables auto building for the branch.
    ///   - enableBasicAuth:  Enables basic authorization for the branch.
    ///   - enableNotification:  Enables notifications for the branch.
    ///   - enablePerformanceMode: Enables performance mode for the branch. Performance mode optimizes for faster hosting performance by keeping content cached at the edge for a longer interval. When performance mode is enabled, hosting configuration or code changes can take up to 10 minutes to roll out.
    ///   - enablePullRequestPreview:  Enables pull request previews for this branch.
    ///   - enableSkewProtection: Specifies whether the skew protection feature is enabled for the branch. Deployment skew protection is available to Amplify applications to eliminate version skew issues between client and servers in web applications. When you apply skew protection to a branch, you can ensure that your clients always interact with the correct version of server-side assets, regardless of when a deployment occurs. For more information about skew protection, see Skew protection for Amplify deployments in the Amplify User Guide.
    ///   - environmentVariables:  The environment variables for the branch.
    ///   - framework:  The framework for the branch.
    ///   - pullRequestEnvironmentName:  The Amplify environment name for the pull request.
    ///   - stage: Describes the current stage for the branch.
    ///   - tags:  The tag for the branch.
    ///   - ttl:  The content Time To Live (TTL) for the website in seconds.
    ///   - logger: Logger use during operation
    @inlinable
    public func createBranch(
        appId: String,
        backend: Backend? = nil,
        backendEnvironmentArn: String? = nil,
        basicAuthCredentials: String? = nil,
        branchName: String,
        buildSpec: String? = nil,
        computeRoleArn: String? = nil,
        description: String? = nil,
        displayName: String? = nil,
        enableAutoBuild: Bool? = nil,
        enableBasicAuth: Bool? = nil,
        enableNotification: Bool? = nil,
        enablePerformanceMode: Bool? = nil,
        enablePullRequestPreview: Bool? = nil,
        enableSkewProtection: Bool? = nil,
        environmentVariables: [String: String]? = nil,
        framework: String? = nil,
        pullRequestEnvironmentName: String? = nil,
        stage: Stage? = nil,
        tags: [String: String]? = nil,
        ttl: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateBranchResult {
        let input = CreateBranchRequest(
            appId: appId, 
            backend: backend, 
            backendEnvironmentArn: backendEnvironmentArn, 
            basicAuthCredentials: basicAuthCredentials, 
            branchName: branchName, 
            buildSpec: buildSpec, 
            computeRoleArn: computeRoleArn, 
            description: description, 
            displayName: displayName, 
            enableAutoBuild: enableAutoBuild, 
            enableBasicAuth: enableBasicAuth, 
            enableNotification: enableNotification, 
            enablePerformanceMode: enablePerformanceMode, 
            enablePullRequestPreview: enablePullRequestPreview, 
            enableSkewProtection: enableSkewProtection, 
            environmentVariables: environmentVariables, 
            framework: framework, 
            pullRequestEnvironmentName: pullRequestEnvironmentName, 
            stage: stage, 
            tags: tags, 
            ttl: ttl
        )
        return try await self.createBranch(input, logger: logger)
    }

    /// Creates a deployment for a manually deployed Amplify app. Manually deployed apps are not connected to a Git repository.  The maximum duration between the CreateDeployment call and the StartDeployment call cannot exceed 8 hours. If the duration exceeds 8 hours, the StartDeployment call and the associated Job will fail.
    @Sendable
    @inlinable
    public func createDeployment(_ input: CreateDeploymentRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateDeploymentResult {
        try await self.client.execute(
            operation: "CreateDeployment", 
            path: "/apps/{appId}/branches/{branchName}/deployments", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a deployment for a manually deployed Amplify app. Manually deployed apps are not connected to a Git repository.  The maximum duration between the CreateDeployment call and the StartDeployment call cannot exceed 8 hours. If the duration exceeds 8 hours, the StartDeployment call and the associated Job will fail.
    ///
    /// Parameters:
    ///   - appId:  The unique ID for an Amplify app.
    ///   - branchName:  The name of the branch to use for the job.
    ///   - fileMap:  An optional file map that contains the file name as the key and the file content md5 hash as the value. If this argument is provided, the service will generate a unique upload URL per file. Otherwise, the service will only generate a single upload URL for the zipped files.
    ///   - logger: Logger use during operation
    @inlinable
    public func createDeployment(
        appId: String,
        branchName: String,
        fileMap: [String: String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateDeploymentResult {
        let input = CreateDeploymentRequest(
            appId: appId, 
            branchName: branchName, 
            fileMap: fileMap
        )
        return try await self.createDeployment(input, logger: logger)
    }

    /// Creates a new domain association for an Amplify app. This action associates a custom domain with the Amplify app
    @Sendable
    @inlinable
    public func createDomainAssociation(_ input: CreateDomainAssociationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateDomainAssociationResult {
        try await self.client.execute(
            operation: "CreateDomainAssociation", 
            path: "/apps/{appId}/domains", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new domain association for an Amplify app. This action associates a custom domain with the Amplify app
    ///
    /// Parameters:
    ///   - appId:  The unique ID for an Amplify app.
    ///   - autoSubDomainCreationPatterns:  Sets the branch patterns for automatic subdomain creation.
    ///   - autoSubDomainIAMRole:  The required AWS Identity and Access Management (IAM) service role for the Amazon Resource Name (ARN) for automatically creating subdomains.
    ///   - certificateSettings: The type of SSL/TLS certificate to use for your custom domain. If you don't specify a certificate type, Amplify uses the default certificate that it provisions and manages for you.
    ///   - domainName:  The domain name for the domain association.
    ///   - enableAutoSubDomain:  Enables the automated creation of subdomains for branches.
    ///   - subDomainSettings:  The setting for the subdomain.
    ///   - logger: Logger use during operation
    @inlinable
    public func createDomainAssociation(
        appId: String,
        autoSubDomainCreationPatterns: [String]? = nil,
        autoSubDomainIAMRole: String? = nil,
        certificateSettings: CertificateSettings? = nil,
        domainName: String,
        enableAutoSubDomain: Bool? = nil,
        subDomainSettings: [SubDomainSetting],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateDomainAssociationResult {
        let input = CreateDomainAssociationRequest(
            appId: appId, 
            autoSubDomainCreationPatterns: autoSubDomainCreationPatterns, 
            autoSubDomainIAMRole: autoSubDomainIAMRole, 
            certificateSettings: certificateSettings, 
            domainName: domainName, 
            enableAutoSubDomain: enableAutoSubDomain, 
            subDomainSettings: subDomainSettings
        )
        return try await self.createDomainAssociation(input, logger: logger)
    }

    /// Creates a new webhook on an Amplify app.
    @Sendable
    @inlinable
    public func createWebhook(_ input: CreateWebhookRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateWebhookResult {
        try await self.client.execute(
            operation: "CreateWebhook", 
            path: "/apps/{appId}/webhooks", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new webhook on an Amplify app.
    ///
    /// Parameters:
    ///   - appId: The unique ID for an Amplify app.
    ///   - branchName: The name for a branch that is part of an Amplify app.
    ///   - description: The description for a webhook.
    ///   - logger: Logger use during operation
    @inlinable
    public func createWebhook(
        appId: String,
        branchName: String,
        description: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateWebhookResult {
        let input = CreateWebhookRequest(
            appId: appId, 
            branchName: branchName, 
            description: description
        )
        return try await self.createWebhook(input, logger: logger)
    }

    /// Deletes an existing Amplify app specified by an app ID.
    @Sendable
    @inlinable
    public func deleteApp(_ input: DeleteAppRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteAppResult {
        try await self.client.execute(
            operation: "DeleteApp", 
            path: "/apps/{appId}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an existing Amplify app specified by an app ID.
    ///
    /// Parameters:
    ///   - appId: The unique ID for an Amplify app.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteApp(
        appId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteAppResult {
        let input = DeleteAppRequest(
            appId: appId
        )
        return try await self.deleteApp(input, logger: logger)
    }

    /// Deletes a backend environment for an Amplify app.  This API is available only to Amplify Gen 1 applications where the backend is created using Amplify Studio or the Amplify command line interface (CLI). This API isn’t available to Amplify Gen 2 applications. When you deploy an application with Amplify Gen 2, you provision the app's backend infrastructure using Typescript code.
    @Sendable
    @inlinable
    public func deleteBackendEnvironment(_ input: DeleteBackendEnvironmentRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteBackendEnvironmentResult {
        try await self.client.execute(
            operation: "DeleteBackendEnvironment", 
            path: "/apps/{appId}/backendenvironments/{environmentName}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a backend environment for an Amplify app.  This API is available only to Amplify Gen 1 applications where the backend is created using Amplify Studio or the Amplify command line interface (CLI). This API isn’t available to Amplify Gen 2 applications. When you deploy an application with Amplify Gen 2, you provision the app's backend infrastructure using Typescript code.
    ///
    /// Parameters:
    ///   - appId: The unique ID of an Amplify app.
    ///   - environmentName: The name of a backend environment of an Amplify app.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteBackendEnvironment(
        appId: String,
        environmentName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteBackendEnvironmentResult {
        let input = DeleteBackendEnvironmentRequest(
            appId: appId, 
            environmentName: environmentName
        )
        return try await self.deleteBackendEnvironment(input, logger: logger)
    }

    ///  Deletes a branch for an Amplify app.
    @Sendable
    @inlinable
    public func deleteBranch(_ input: DeleteBranchRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteBranchResult {
        try await self.client.execute(
            operation: "DeleteBranch", 
            path: "/apps/{appId}/branches/{branchName}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Deletes a branch for an Amplify app.
    ///
    /// Parameters:
    ///   - appId:  The unique ID for an Amplify app.
    ///   - branchName: The name of the branch.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteBranch(
        appId: String,
        branchName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteBranchResult {
        let input = DeleteBranchRequest(
            appId: appId, 
            branchName: branchName
        )
        return try await self.deleteBranch(input, logger: logger)
    }

    /// Deletes a domain association for an Amplify app.
    @Sendable
    @inlinable
    public func deleteDomainAssociation(_ input: DeleteDomainAssociationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteDomainAssociationResult {
        try await self.client.execute(
            operation: "DeleteDomainAssociation", 
            path: "/apps/{appId}/domains/{domainName}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a domain association for an Amplify app.
    ///
    /// Parameters:
    ///   - appId:  The unique id for an Amplify app.
    ///   - domainName:  The name of the domain.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteDomainAssociation(
        appId: String,
        domainName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteDomainAssociationResult {
        let input = DeleteDomainAssociationRequest(
            appId: appId, 
            domainName: domainName
        )
        return try await self.deleteDomainAssociation(input, logger: logger)
    }

    ///  Deletes a job for a branch of an Amplify app.
    @Sendable
    @inlinable
    public func deleteJob(_ input: DeleteJobRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteJobResult {
        try await self.client.execute(
            operation: "DeleteJob", 
            path: "/apps/{appId}/branches/{branchName}/jobs/{jobId}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Deletes a job for a branch of an Amplify app.
    ///
    /// Parameters:
    ///   - appId:  The unique ID for an Amplify app.
    ///   - branchName: The name of the branch to use for the job.
    ///   - jobId:  The unique ID for the job.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteJob(
        appId: String,
        branchName: String,
        jobId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteJobResult {
        let input = DeleteJobRequest(
            appId: appId, 
            branchName: branchName, 
            jobId: jobId
        )
        return try await self.deleteJob(input, logger: logger)
    }

    /// Deletes a webhook.
    @Sendable
    @inlinable
    public func deleteWebhook(_ input: DeleteWebhookRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteWebhookResult {
        try await self.client.execute(
            operation: "DeleteWebhook", 
            path: "/webhooks/{webhookId}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a webhook.
    ///
    /// Parameters:
    ///   - webhookId: The unique ID for a webhook.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteWebhook(
        webhookId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteWebhookResult {
        let input = DeleteWebhookRequest(
            webhookId: webhookId
        )
        return try await self.deleteWebhook(input, logger: logger)
    }

    /// Returns the website access logs for a specific time range using a presigned URL.
    @Sendable
    @inlinable
    public func generateAccessLogs(_ input: GenerateAccessLogsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GenerateAccessLogsResult {
        try await self.client.execute(
            operation: "GenerateAccessLogs", 
            path: "/apps/{appId}/accesslogs", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the website access logs for a specific time range using a presigned URL.
    ///
    /// Parameters:
    ///   - appId: The unique ID for an Amplify app.
    ///   - domainName: The name of the domain.
    ///   - endTime: The time at which the logs should end. The time range specified is inclusive of the end time.
    ///   - startTime: The time at which the logs should start. The time range specified is inclusive of the start time.
    ///   - logger: Logger use during operation
    @inlinable
    public func generateAccessLogs(
        appId: String,
        domainName: String,
        endTime: Date? = nil,
        startTime: Date? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GenerateAccessLogsResult {
        let input = GenerateAccessLogsRequest(
            appId: appId, 
            domainName: domainName, 
            endTime: endTime, 
            startTime: startTime
        )
        return try await self.generateAccessLogs(input, logger: logger)
    }

    /// Returns an existing Amplify app specified by an app ID.
    @Sendable
    @inlinable
    public func getApp(_ input: GetAppRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetAppResult {
        try await self.client.execute(
            operation: "GetApp", 
            path: "/apps/{appId}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns an existing Amplify app specified by an app ID.
    ///
    /// Parameters:
    ///   - appId: The unique ID for an Amplify app.
    ///   - logger: Logger use during operation
    @inlinable
    public func getApp(
        appId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetAppResult {
        let input = GetAppRequest(
            appId: appId
        )
        return try await self.getApp(input, logger: logger)
    }

    /// Returns the artifact info that corresponds to an artifact id.
    @Sendable
    @inlinable
    public func getArtifactUrl(_ input: GetArtifactUrlRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetArtifactUrlResult {
        try await self.client.execute(
            operation: "GetArtifactUrl", 
            path: "/artifacts/{artifactId}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the artifact info that corresponds to an artifact id.
    ///
    /// Parameters:
    ///   - artifactId: The unique ID for an artifact.
    ///   - logger: Logger use during operation
    @inlinable
    public func getArtifactUrl(
        artifactId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetArtifactUrlResult {
        let input = GetArtifactUrlRequest(
            artifactId: artifactId
        )
        return try await self.getArtifactUrl(input, logger: logger)
    }

    /// Returns a backend environment for an Amplify app.  This API is available only to Amplify Gen 1 applications where the backend is created using Amplify Studio or the Amplify command line interface (CLI). This API isn’t available to Amplify Gen 2 applications. When you deploy an application with Amplify Gen 2, you provision the app's backend infrastructure using Typescript code.
    @Sendable
    @inlinable
    public func getBackendEnvironment(_ input: GetBackendEnvironmentRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetBackendEnvironmentResult {
        try await self.client.execute(
            operation: "GetBackendEnvironment", 
            path: "/apps/{appId}/backendenvironments/{environmentName}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a backend environment for an Amplify app.  This API is available only to Amplify Gen 1 applications where the backend is created using Amplify Studio or the Amplify command line interface (CLI). This API isn’t available to Amplify Gen 2 applications. When you deploy an application with Amplify Gen 2, you provision the app's backend infrastructure using Typescript code.
    ///
    /// Parameters:
    ///   - appId: The unique id for an Amplify app.
    ///   - environmentName: The name for the backend environment.
    ///   - logger: Logger use during operation
    @inlinable
    public func getBackendEnvironment(
        appId: String,
        environmentName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetBackendEnvironmentResult {
        let input = GetBackendEnvironmentRequest(
            appId: appId, 
            environmentName: environmentName
        )
        return try await self.getBackendEnvironment(input, logger: logger)
    }

    ///  Returns a branch for an Amplify app.
    @Sendable
    @inlinable
    public func getBranch(_ input: GetBranchRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetBranchResult {
        try await self.client.execute(
            operation: "GetBranch", 
            path: "/apps/{appId}/branches/{branchName}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns a branch for an Amplify app.
    ///
    /// Parameters:
    ///   - appId:  The unique ID for an Amplify app.
    ///   - branchName: The name of the branch.
    ///   - logger: Logger use during operation
    @inlinable
    public func getBranch(
        appId: String,
        branchName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetBranchResult {
        let input = GetBranchRequest(
            appId: appId, 
            branchName: branchName
        )
        return try await self.getBranch(input, logger: logger)
    }

    /// Returns the domain information for an Amplify app.
    @Sendable
    @inlinable
    public func getDomainAssociation(_ input: GetDomainAssociationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetDomainAssociationResult {
        try await self.client.execute(
            operation: "GetDomainAssociation", 
            path: "/apps/{appId}/domains/{domainName}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the domain information for an Amplify app.
    ///
    /// Parameters:
    ///   - appId:  The unique id for an Amplify app.
    ///   - domainName:  The name of the domain.
    ///   - logger: Logger use during operation
    @inlinable
    public func getDomainAssociation(
        appId: String,
        domainName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetDomainAssociationResult {
        let input = GetDomainAssociationRequest(
            appId: appId, 
            domainName: domainName
        )
        return try await self.getDomainAssociation(input, logger: logger)
    }

    ///  Returns a job for a branch of an Amplify app.
    @Sendable
    @inlinable
    public func getJob(_ input: GetJobRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetJobResult {
        try await self.client.execute(
            operation: "GetJob", 
            path: "/apps/{appId}/branches/{branchName}/jobs/{jobId}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns a job for a branch of an Amplify app.
    ///
    /// Parameters:
    ///   - appId: The unique ID for an Amplify app.
    ///   - branchName: The name of the branch to use for the job.
    ///   - jobId: The unique ID for the job.
    ///   - logger: Logger use during operation
    @inlinable
    public func getJob(
        appId: String,
        branchName: String,
        jobId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetJobResult {
        let input = GetJobRequest(
            appId: appId, 
            branchName: branchName, 
            jobId: jobId
        )
        return try await self.getJob(input, logger: logger)
    }

    /// Returns the webhook information that corresponds to a specified webhook ID.
    @Sendable
    @inlinable
    public func getWebhook(_ input: GetWebhookRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetWebhookResult {
        try await self.client.execute(
            operation: "GetWebhook", 
            path: "/webhooks/{webhookId}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the webhook information that corresponds to a specified webhook ID.
    ///
    /// Parameters:
    ///   - webhookId: The unique ID for a webhook.
    ///   - logger: Logger use during operation
    @inlinable
    public func getWebhook(
        webhookId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetWebhookResult {
        let input = GetWebhookRequest(
            webhookId: webhookId
        )
        return try await self.getWebhook(input, logger: logger)
    }

    /// Returns a list of the existing Amplify apps.
    @Sendable
    @inlinable
    public func listApps(_ input: ListAppsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListAppsResult {
        try await self.client.execute(
            operation: "ListApps", 
            path: "/apps", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of the existing Amplify apps.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of records to list in a single response.
    ///   - nextToken: A pagination token. If non-null, the pagination token is returned in a result. Pass its value in another request to retrieve more entries.
    ///   - logger: Logger use during operation
    @inlinable
    public func listApps(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListAppsResult {
        let input = ListAppsRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listApps(input, logger: logger)
    }

    /// Returns a list of end-to-end testing artifacts for a specified app, branch, and job. To return the build artifacts, use the GetJob API. For more information about Amplify testing support, see Setting up end-to-end Cypress tests for your Amplify application in the Amplify Hosting User Guide.
    @Sendable
    @inlinable
    public func listArtifacts(_ input: ListArtifactsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListArtifactsResult {
        try await self.client.execute(
            operation: "ListArtifacts", 
            path: "/apps/{appId}/branches/{branchName}/jobs/{jobId}/artifacts", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of end-to-end testing artifacts for a specified app, branch, and job. To return the build artifacts, use the GetJob API. For more information about Amplify testing support, see Setting up end-to-end Cypress tests for your Amplify application in the Amplify Hosting User Guide.
    ///
    /// Parameters:
    ///   - appId: The unique ID for an Amplify app.
    ///   - branchName: The name of a branch that is part of an Amplify app.
    ///   - jobId: The unique ID for a job.
    ///   - maxResults: The maximum number of records to list in a single response.
    ///   - nextToken: A pagination token. Set to null to start listing artifacts from start. If a non-null pagination token is returned in a result, pass its value in here to list more artifacts.
    ///   - logger: Logger use during operation
    @inlinable
    public func listArtifacts(
        appId: String,
        branchName: String,
        jobId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListArtifactsResult {
        let input = ListArtifactsRequest(
            appId: appId, 
            branchName: branchName, 
            jobId: jobId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listArtifacts(input, logger: logger)
    }

    /// Lists the backend environments for an Amplify app.  This API is available only to Amplify Gen 1 applications where the backend is created using Amplify Studio or the Amplify command line interface (CLI). This API isn’t available to Amplify Gen 2 applications. When you deploy an application with Amplify Gen 2, you provision the app's backend infrastructure using Typescript code.
    @Sendable
    @inlinable
    public func listBackendEnvironments(_ input: ListBackendEnvironmentsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListBackendEnvironmentsResult {
        try await self.client.execute(
            operation: "ListBackendEnvironments", 
            path: "/apps/{appId}/backendenvironments", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the backend environments for an Amplify app.  This API is available only to Amplify Gen 1 applications where the backend is created using Amplify Studio or the Amplify command line interface (CLI). This API isn’t available to Amplify Gen 2 applications. When you deploy an application with Amplify Gen 2, you provision the app's backend infrastructure using Typescript code.
    ///
    /// Parameters:
    ///   - appId: The unique ID for an Amplify app.
    ///   - environmentName: The name of the backend environment
    ///   - maxResults: The maximum number of records to list in a single response.
    ///   - nextToken: A pagination token. Set to null to start listing backend environments from the start. If a non-null pagination token is returned in a result, pass its value in here to list more backend environments.
    ///   - logger: Logger use during operation
    @inlinable
    public func listBackendEnvironments(
        appId: String,
        environmentName: String? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListBackendEnvironmentsResult {
        let input = ListBackendEnvironmentsRequest(
            appId: appId, 
            environmentName: environmentName, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listBackendEnvironments(input, logger: logger)
    }

    ///  Lists the branches of an Amplify app.
    @Sendable
    @inlinable
    public func listBranches(_ input: ListBranchesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListBranchesResult {
        try await self.client.execute(
            operation: "ListBranches", 
            path: "/apps/{appId}/branches", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Lists the branches of an Amplify app.
    ///
    /// Parameters:
    ///   - appId: The unique ID for an Amplify app.
    ///   - maxResults:  The maximum number of records to list in a single response.
    ///   - nextToken: A pagination token. Set to null to start listing branches from the start. If a non-null pagination token is returned in a result, pass its value in here to list more branches.
    ///   - logger: Logger use during operation
    @inlinable
    public func listBranches(
        appId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListBranchesResult {
        let input = ListBranchesRequest(
            appId: appId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listBranches(input, logger: logger)
    }

    /// Returns the domain associations for an Amplify app.
    @Sendable
    @inlinable
    public func listDomainAssociations(_ input: ListDomainAssociationsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListDomainAssociationsResult {
        try await self.client.execute(
            operation: "ListDomainAssociations", 
            path: "/apps/{appId}/domains", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the domain associations for an Amplify app.
    ///
    /// Parameters:
    ///   - appId:  The unique ID for an Amplify app.
    ///   - maxResults:  The maximum number of records to list in a single response.
    ///   - nextToken:  A pagination token. Set to null to start listing apps from the start. If non-null, a pagination token is returned in a result. Pass its value in here to list more projects.
    ///   - logger: Logger use during operation
    @inlinable
    public func listDomainAssociations(
        appId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListDomainAssociationsResult {
        let input = ListDomainAssociationsRequest(
            appId: appId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listDomainAssociations(input, logger: logger)
    }

    ///  Lists the jobs for a branch of an Amplify app.
    @Sendable
    @inlinable
    public func listJobs(_ input: ListJobsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListJobsResult {
        try await self.client.execute(
            operation: "ListJobs", 
            path: "/apps/{appId}/branches/{branchName}/jobs", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Lists the jobs for a branch of an Amplify app.
    ///
    /// Parameters:
    ///   - appId:  The unique ID for an Amplify app.
    ///   - branchName: The name of the branch to use for the request.
    ///   - maxResults: The maximum number of records to list in a single response.
    ///   - nextToken: A pagination token. Set to null to start listing steps from the start. If a non-null pagination token is returned in a result, pass its value in here to list more steps.
    ///   - logger: Logger use during operation
    @inlinable
    public func listJobs(
        appId: String,
        branchName: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListJobsResult {
        let input = ListJobsRequest(
            appId: appId, 
            branchName: branchName, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listJobs(input, logger: logger)
    }

    /// Returns a list of tags for a specified Amazon Resource Name (ARN).
    @Sendable
    @inlinable
    public func listTagsForResource(_ input: ListTagsForResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTagsForResourceResponse {
        try await self.client.execute(
            operation: "ListTagsForResource", 
            path: "/tags/{resourceArn}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of tags for a specified Amazon Resource Name (ARN).
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) to use to list tags.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTagsForResource(
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTagsForResourceResponse {
        let input = ListTagsForResourceRequest(
            resourceArn: resourceArn
        )
        return try await self.listTagsForResource(input, logger: logger)
    }

    /// Returns a list of webhooks for an Amplify app.
    @Sendable
    @inlinable
    public func listWebhooks(_ input: ListWebhooksRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListWebhooksResult {
        try await self.client.execute(
            operation: "ListWebhooks", 
            path: "/apps/{appId}/webhooks", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of webhooks for an Amplify app.
    ///
    /// Parameters:
    ///   - appId: The unique ID for an Amplify app.
    ///   - maxResults: The maximum number of records to list in a single response.
    ///   - nextToken: A pagination token. Set to null to start listing webhooks from the start. If non-null,the pagination token is returned in a result. Pass its value in here to list more webhooks.
    ///   - logger: Logger use during operation
    @inlinable
    public func listWebhooks(
        appId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListWebhooksResult {
        let input = ListWebhooksRequest(
            appId: appId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listWebhooks(input, logger: logger)
    }

    /// Starts a deployment for a manually deployed app. Manually deployed apps are not connected to a Git repository.  The maximum duration between the CreateDeployment call and the StartDeployment call cannot exceed 8 hours. If the duration exceeds 8 hours, the StartDeployment call and the associated Job will fail.
    @Sendable
    @inlinable
    public func startDeployment(_ input: StartDeploymentRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StartDeploymentResult {
        try await self.client.execute(
            operation: "StartDeployment", 
            path: "/apps/{appId}/branches/{branchName}/deployments/start", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Starts a deployment for a manually deployed app. Manually deployed apps are not connected to a Git repository.  The maximum duration between the CreateDeployment call and the StartDeployment call cannot exceed 8 hours. If the duration exceeds 8 hours, the StartDeployment call and the associated Job will fail.
    ///
    /// Parameters:
    ///   - appId: The unique ID for an Amplify app.
    ///   - branchName: The name of the branch to use for the deployment job.
    ///   - jobId: The job ID for this deployment that is generated by the CreateDeployment request.
    ///   - sourceUrl: The source URL for the deployment that is used when calling StartDeployment without CreateDeployment. The source URL can be either an HTTP GET URL that is publicly accessible and downloads a single .zip file, or an Amazon S3 bucket and prefix.
    ///   - sourceUrlType: The type of source specified by the sourceURL. If the value is ZIP, the source is a .zip file. If the value is BUCKET_PREFIX, the source is an Amazon S3 bucket and prefix. If no value is specified, the default is ZIP.
    ///   - logger: Logger use during operation
    @inlinable
    public func startDeployment(
        appId: String,
        branchName: String,
        jobId: String? = nil,
        sourceUrl: String? = nil,
        sourceUrlType: SourceUrlType? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartDeploymentResult {
        let input = StartDeploymentRequest(
            appId: appId, 
            branchName: branchName, 
            jobId: jobId, 
            sourceUrl: sourceUrl, 
            sourceUrlType: sourceUrlType
        )
        return try await self.startDeployment(input, logger: logger)
    }

    ///  Starts a new job for a branch of an Amplify app.
    @Sendable
    @inlinable
    public func startJob(_ input: StartJobRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StartJobResult {
        try await self.client.execute(
            operation: "StartJob", 
            path: "/apps/{appId}/branches/{branchName}/jobs", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Starts a new job for a branch of an Amplify app.
    ///
    /// Parameters:
    ///   - appId: The unique ID for an Amplify app.
    ///   - branchName: The name of the branch to use for the job.
    ///   - commitId:  The commit ID from a third-party repository provider for the job.
    ///   - commitMessage:  The commit message from a third-party repository provider for the job.
    ///   - commitTime:  The commit date and time for the job.
    ///   - jobId: The unique ID for an existing job. This is required if the value of jobType is RETRY.
    ///   - jobReason: A descriptive reason for starting the job.
    ///   - jobType: Describes the type for the job. The job type RELEASE starts a new job with the latest change from the specified branch. This value is available only for apps that are connected to a repository.  The job type RETRY retries an existing job. If the job type value is RETRY, the jobId is also required.
    ///   - logger: Logger use during operation
    @inlinable
    public func startJob(
        appId: String,
        branchName: String,
        commitId: String? = nil,
        commitMessage: String? = nil,
        commitTime: Date? = nil,
        jobId: String? = nil,
        jobReason: String? = nil,
        jobType: JobType,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartJobResult {
        let input = StartJobRequest(
            appId: appId, 
            branchName: branchName, 
            commitId: commitId, 
            commitMessage: commitMessage, 
            commitTime: commitTime, 
            jobId: jobId, 
            jobReason: jobReason, 
            jobType: jobType
        )
        return try await self.startJob(input, logger: logger)
    }

    ///  Stops a job that is in progress for a branch of an Amplify app.
    @Sendable
    @inlinable
    public func stopJob(_ input: StopJobRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StopJobResult {
        try await self.client.execute(
            operation: "StopJob", 
            path: "/apps/{appId}/branches/{branchName}/jobs/{jobId}/stop", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Stops a job that is in progress for a branch of an Amplify app.
    ///
    /// Parameters:
    ///   - appId:  The unique ID for an Amplify app.
    ///   - branchName: The name of the branch to use for the stop job request.
    ///   - jobId:  The unique id for the job.
    ///   - logger: Logger use during operation
    @inlinable
    public func stopJob(
        appId: String,
        branchName: String,
        jobId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StopJobResult {
        let input = StopJobRequest(
            appId: appId, 
            branchName: branchName, 
            jobId: jobId
        )
        return try await self.stopJob(input, logger: logger)
    }

    /// Tags the resource with a tag key and value.
    @Sendable
    @inlinable
    public func tagResource(_ input: TagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> TagResourceResponse {
        try await self.client.execute(
            operation: "TagResource", 
            path: "/tags/{resourceArn}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Tags the resource with a tag key and value.
    ///
    /// Parameters:
    ///   - resourceArn:  The Amazon Resource Name (ARN) to use to tag a resource.
    ///   - tags: The tags used to tag the resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func tagResource(
        resourceArn: String,
        tags: [String: String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> TagResourceResponse {
        let input = TagResourceRequest(
            resourceArn: resourceArn, 
            tags: tags
        )
        return try await self.tagResource(input, logger: logger)
    }

    /// Untags a resource with a specified Amazon Resource Name (ARN).
    @Sendable
    @inlinable
    public func untagResource(_ input: UntagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UntagResourceResponse {
        try await self.client.execute(
            operation: "UntagResource", 
            path: "/tags/{resourceArn}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Untags a resource with a specified Amazon Resource Name (ARN).
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) to use to untag a resource.
    ///   - tagKeys: The tag keys to use to untag a resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func untagResource(
        resourceArn: String,
        tagKeys: [String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UntagResourceResponse {
        let input = UntagResourceRequest(
            resourceArn: resourceArn, 
            tagKeys: tagKeys
        )
        return try await self.untagResource(input, logger: logger)
    }

    /// Updates an existing Amplify app.
    @Sendable
    @inlinable
    public func updateApp(_ input: UpdateAppRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateAppResult {
        try await self.client.execute(
            operation: "UpdateApp", 
            path: "/apps/{appId}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates an existing Amplify app.
    ///
    /// Parameters:
    ///   - accessToken: The personal access token for a GitHub repository for an Amplify app. The personal access token is used to authorize access to a GitHub repository using the Amplify GitHub App. The token is not stored. Use accessToken for GitHub repositories only. To authorize access to a repository provider such as Bitbucket or CodeCommit, use oauthToken. You must specify either accessToken or oauthToken when you update an app. Existing Amplify apps deployed from a GitHub repository using OAuth continue to work with CI/CD. However, we strongly recommend that you migrate these apps to use the GitHub App. For more information, see Migrating an existing OAuth app to the Amplify GitHub App in the Amplify User Guide .
    ///   - appId: The unique ID for an Amplify app.
    ///   - autoBranchCreationConfig: The automated branch creation configuration for an Amplify app.
    ///   - autoBranchCreationPatterns: Describes the automated branch creation glob patterns for an Amplify app.
    ///   - basicAuthCredentials: The basic authorization credentials for an Amplify app. You must base64-encode the authorization credentials and provide them in the format user:password.
    ///   - buildSpec: The build specification (build spec) for an Amplify app.
    ///   - cacheConfig: The cache configuration for the Amplify app.
    ///   - computeRoleArn: The Amazon Resource Name (ARN) of the IAM role to assign to an SSR app. The SSR Compute role allows the Amplify Hosting compute service to securely access specific Amazon Web Services resources based on the role's permissions. For more information about the SSR Compute role, see Adding an SSR Compute role in the Amplify User Guide.
    ///   - customHeaders: The custom HTTP headers for an Amplify app.
    ///   - customRules: The custom redirect and rewrite rules for an Amplify app.
    ///   - description: The description for an Amplify app.
    ///   - enableAutoBranchCreation: Enables automated branch creation for an Amplify app.
    ///   - enableBasicAuth: Enables basic authorization for an Amplify app.
    ///   - enableBranchAutoBuild: Enables branch auto-building for an Amplify app.
    ///   - enableBranchAutoDeletion: Automatically disconnects a branch in the Amplify console when you delete a branch from your Git repository.
    ///   - environmentVariables: The environment variables for an Amplify app.
    ///   - iamServiceRoleArn: The Amazon Resource Name (ARN) of the IAM service role for the Amplify app.
    ///   - jobConfig: Describes the configuration details that apply to the jobs for an Amplify app.
    ///   - name: The name for an Amplify app.
    ///   - oauthToken: The OAuth token for a third-party source control system for an Amplify app. The OAuth token is used to create a webhook and a read-only deploy key using SSH cloning. The OAuth token is not stored. Use oauthToken for repository providers other than GitHub, such as Bitbucket or CodeCommit. To authorize access to GitHub as your repository provider, use accessToken. You must specify either oauthToken or accessToken when you update an app. Existing Amplify apps deployed from a GitHub repository using OAuth continue to work with CI/CD. However, we strongly recommend that you migrate these apps to use the GitHub App. For more information, see Migrating an existing OAuth app to the Amplify GitHub App in the Amplify User Guide .
    ///   - platform: The platform for the Amplify app. For a static app, set the platform type to WEB. For a dynamic server-side rendered (SSR) app, set the platform type to WEB_COMPUTE. For an app requiring Amplify Hosting's original SSR support only, set the platform type to WEB_DYNAMIC. If you are deploying an SSG only app with Next.js version 14 or later, you must set the platform type to WEB_COMPUTE.
    ///   - repository: The name of the Git repository for an Amplify app.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateApp(
        accessToken: String? = nil,
        appId: String,
        autoBranchCreationConfig: AutoBranchCreationConfig? = nil,
        autoBranchCreationPatterns: [String]? = nil,
        basicAuthCredentials: String? = nil,
        buildSpec: String? = nil,
        cacheConfig: CacheConfig? = nil,
        computeRoleArn: String? = nil,
        customHeaders: String? = nil,
        customRules: [CustomRule]? = nil,
        description: String? = nil,
        enableAutoBranchCreation: Bool? = nil,
        enableBasicAuth: Bool? = nil,
        enableBranchAutoBuild: Bool? = nil,
        enableBranchAutoDeletion: Bool? = nil,
        environmentVariables: [String: String]? = nil,
        iamServiceRoleArn: String? = nil,
        jobConfig: JobConfig? = nil,
        name: String? = nil,
        oauthToken: String? = nil,
        platform: Platform? = nil,
        repository: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateAppResult {
        let input = UpdateAppRequest(
            accessToken: accessToken, 
            appId: appId, 
            autoBranchCreationConfig: autoBranchCreationConfig, 
            autoBranchCreationPatterns: autoBranchCreationPatterns, 
            basicAuthCredentials: basicAuthCredentials, 
            buildSpec: buildSpec, 
            cacheConfig: cacheConfig, 
            computeRoleArn: computeRoleArn, 
            customHeaders: customHeaders, 
            customRules: customRules, 
            description: description, 
            enableAutoBranchCreation: enableAutoBranchCreation, 
            enableBasicAuth: enableBasicAuth, 
            enableBranchAutoBuild: enableBranchAutoBuild, 
            enableBranchAutoDeletion: enableBranchAutoDeletion, 
            environmentVariables: environmentVariables, 
            iamServiceRoleArn: iamServiceRoleArn, 
            jobConfig: jobConfig, 
            name: name, 
            oauthToken: oauthToken, 
            platform: platform, 
            repository: repository
        )
        return try await self.updateApp(input, logger: logger)
    }

    ///  Updates a branch for an Amplify app.
    @Sendable
    @inlinable
    public func updateBranch(_ input: UpdateBranchRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateBranchResult {
        try await self.client.execute(
            operation: "UpdateBranch", 
            path: "/apps/{appId}/branches/{branchName}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Updates a branch for an Amplify app.
    ///
    /// Parameters:
    ///   - appId:  The unique ID for an Amplify app.
    ///   - backend: The backend for a Branch of an Amplify app. Use for a backend created from an CloudFormation stack. This field is available to Amplify Gen 2 apps only. When you deploy an application with Amplify Gen 2, you provision the app's backend infrastructure using Typescript code.
    ///   - backendEnvironmentArn: The Amazon Resource Name (ARN) for a backend environment that is part of a Gen 1 Amplify app.  This field is available to Amplify Gen 1 apps only where the backend is created using Amplify Studio or the Amplify command line interface (CLI).
    ///   - basicAuthCredentials:  The basic authorization credentials for the branch. You must base64-encode the authorization credentials and provide them in the format user:password.
    ///   - branchName: The name of the branch.
    ///   - buildSpec:  The build specification (build spec) for the branch.
    ///   - computeRoleArn: The Amazon Resource Name (ARN) of the IAM role to assign to a branch of an SSR app. The SSR Compute role allows the Amplify Hosting compute service to securely access specific Amazon Web Services resources based on the role's permissions. For more information about the SSR Compute role, see Adding an SSR Compute role in the Amplify User Guide.
    ///   - description:  The description for the branch.
    ///   - displayName:  The display name for a branch. This is used as the default domain prefix.
    ///   - enableAutoBuild:  Enables auto building for the branch.
    ///   - enableBasicAuth:  Enables basic authorization for the branch.
    ///   - enableNotification:  Enables notifications for the branch.
    ///   - enablePerformanceMode: Enables performance mode for the branch. Performance mode optimizes for faster hosting performance by keeping content cached at the edge for a longer interval. When performance mode is enabled, hosting configuration or code changes can take up to 10 minutes to roll out.
    ///   - enablePullRequestPreview:  Enables pull request previews for this branch.
    ///   - enableSkewProtection: Specifies whether the skew protection feature is enabled for the branch. Deployment skew protection is available to Amplify applications to eliminate version skew issues between client and servers in web applications. When you apply skew protection to a branch, you can ensure that your clients always interact with the correct version of server-side assets, regardless of when a deployment occurs. For more information about skew protection, see Skew protection for Amplify deployments in the Amplify User Guide.
    ///   - environmentVariables:  The environment variables for the branch.
    ///   - framework:  The framework for the branch.
    ///   - pullRequestEnvironmentName:  The Amplify environment name for the pull request.
    ///   - stage:  Describes the current stage for the branch.
    ///   - ttl:  The content Time to Live (TTL) for the website in seconds.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateBranch(
        appId: String,
        backend: Backend? = nil,
        backendEnvironmentArn: String? = nil,
        basicAuthCredentials: String? = nil,
        branchName: String,
        buildSpec: String? = nil,
        computeRoleArn: String? = nil,
        description: String? = nil,
        displayName: String? = nil,
        enableAutoBuild: Bool? = nil,
        enableBasicAuth: Bool? = nil,
        enableNotification: Bool? = nil,
        enablePerformanceMode: Bool? = nil,
        enablePullRequestPreview: Bool? = nil,
        enableSkewProtection: Bool? = nil,
        environmentVariables: [String: String]? = nil,
        framework: String? = nil,
        pullRequestEnvironmentName: String? = nil,
        stage: Stage? = nil,
        ttl: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateBranchResult {
        let input = UpdateBranchRequest(
            appId: appId, 
            backend: backend, 
            backendEnvironmentArn: backendEnvironmentArn, 
            basicAuthCredentials: basicAuthCredentials, 
            branchName: branchName, 
            buildSpec: buildSpec, 
            computeRoleArn: computeRoleArn, 
            description: description, 
            displayName: displayName, 
            enableAutoBuild: enableAutoBuild, 
            enableBasicAuth: enableBasicAuth, 
            enableNotification: enableNotification, 
            enablePerformanceMode: enablePerformanceMode, 
            enablePullRequestPreview: enablePullRequestPreview, 
            enableSkewProtection: enableSkewProtection, 
            environmentVariables: environmentVariables, 
            framework: framework, 
            pullRequestEnvironmentName: pullRequestEnvironmentName, 
            stage: stage, 
            ttl: ttl
        )
        return try await self.updateBranch(input, logger: logger)
    }

    /// Creates a new domain association for an Amplify app.
    @Sendable
    @inlinable
    public func updateDomainAssociation(_ input: UpdateDomainAssociationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateDomainAssociationResult {
        try await self.client.execute(
            operation: "UpdateDomainAssociation", 
            path: "/apps/{appId}/domains/{domainName}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new domain association for an Amplify app.
    ///
    /// Parameters:
    ///   - appId:  The unique ID for an Amplify app.
    ///   - autoSubDomainCreationPatterns:  Sets the branch patterns for automatic subdomain creation.
    ///   - autoSubDomainIAMRole:  The required AWS Identity and Access Management (IAM) service role for the Amazon Resource Name (ARN) for automatically creating subdomains.
    ///   - certificateSettings: The type of SSL/TLS certificate to use for your custom domain.
    ///   - domainName:  The name of the domain.
    ///   - enableAutoSubDomain:  Enables the automated creation of subdomains for branches.
    ///   - subDomainSettings:  Describes the settings for the subdomain.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateDomainAssociation(
        appId: String,
        autoSubDomainCreationPatterns: [String]? = nil,
        autoSubDomainIAMRole: String? = nil,
        certificateSettings: CertificateSettings? = nil,
        domainName: String,
        enableAutoSubDomain: Bool? = nil,
        subDomainSettings: [SubDomainSetting]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateDomainAssociationResult {
        let input = UpdateDomainAssociationRequest(
            appId: appId, 
            autoSubDomainCreationPatterns: autoSubDomainCreationPatterns, 
            autoSubDomainIAMRole: autoSubDomainIAMRole, 
            certificateSettings: certificateSettings, 
            domainName: domainName, 
            enableAutoSubDomain: enableAutoSubDomain, 
            subDomainSettings: subDomainSettings
        )
        return try await self.updateDomainAssociation(input, logger: logger)
    }

    /// Updates a webhook.
    @Sendable
    @inlinable
    public func updateWebhook(_ input: UpdateWebhookRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateWebhookResult {
        try await self.client.execute(
            operation: "UpdateWebhook", 
            path: "/webhooks/{webhookId}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates a webhook.
    ///
    /// Parameters:
    ///   - branchName: The name for a branch that is part of an Amplify app.
    ///   - description: The description for a webhook.
    ///   - webhookId: The unique ID for a webhook.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateWebhook(
        branchName: String? = nil,
        description: String? = nil,
        webhookId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateWebhookResult {
        let input = UpdateWebhookRequest(
            branchName: branchName, 
            description: description, 
            webhookId: webhookId
        )
        return try await self.updateWebhook(input, logger: logger)
    }
}

extension Amplify {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: Amplify, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}

// MARK: Paginators

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
extension Amplify {
    /// Return PaginatorSequence for operation ``listApps(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listAppsPaginator(
        _ input: ListAppsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListAppsRequest, ListAppsResult> {
        return .init(
            input: input,
            command: self.listApps,
            inputKey: \ListAppsRequest.nextToken,
            outputKey: \ListAppsResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listApps(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of records to list in a single response.
    ///   - logger: Logger used for logging
    @inlinable
    public func listAppsPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListAppsRequest, ListAppsResult> {
        let input = ListAppsRequest(
            maxResults: maxResults
        )
        return self.listAppsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listBranches(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listBranchesPaginator(
        _ input: ListBranchesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListBranchesRequest, ListBranchesResult> {
        return .init(
            input: input,
            command: self.listBranches,
            inputKey: \ListBranchesRequest.nextToken,
            outputKey: \ListBranchesResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listBranches(_:logger:)``.
    ///
    /// - Parameters:
    ///   - appId: The unique ID for an Amplify app.
    ///   - maxResults:  The maximum number of records to list in a single response.
    ///   - logger: Logger used for logging
    @inlinable
    public func listBranchesPaginator(
        appId: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListBranchesRequest, ListBranchesResult> {
        let input = ListBranchesRequest(
            appId: appId, 
            maxResults: maxResults
        )
        return self.listBranchesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listDomainAssociations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listDomainAssociationsPaginator(
        _ input: ListDomainAssociationsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListDomainAssociationsRequest, ListDomainAssociationsResult> {
        return .init(
            input: input,
            command: self.listDomainAssociations,
            inputKey: \ListDomainAssociationsRequest.nextToken,
            outputKey: \ListDomainAssociationsResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listDomainAssociations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - appId:  The unique ID for an Amplify app.
    ///   - maxResults:  The maximum number of records to list in a single response.
    ///   - logger: Logger used for logging
    @inlinable
    public func listDomainAssociationsPaginator(
        appId: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListDomainAssociationsRequest, ListDomainAssociationsResult> {
        let input = ListDomainAssociationsRequest(
            appId: appId, 
            maxResults: maxResults
        )
        return self.listDomainAssociationsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listJobs(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listJobsPaginator(
        _ input: ListJobsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListJobsRequest, ListJobsResult> {
        return .init(
            input: input,
            command: self.listJobs,
            inputKey: \ListJobsRequest.nextToken,
            outputKey: \ListJobsResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listJobs(_:logger:)``.
    ///
    /// - Parameters:
    ///   - appId:  The unique ID for an Amplify app.
    ///   - branchName: The name of the branch to use for the request.
    ///   - maxResults: The maximum number of records to list in a single response.
    ///   - logger: Logger used for logging
    @inlinable
    public func listJobsPaginator(
        appId: String,
        branchName: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListJobsRequest, ListJobsResult> {
        let input = ListJobsRequest(
            appId: appId, 
            branchName: branchName, 
            maxResults: maxResults
        )
        return self.listJobsPaginator(input, logger: logger)
    }
}

extension Amplify.ListAppsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Amplify.ListAppsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension Amplify.ListBranchesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Amplify.ListBranchesRequest {
        return .init(
            appId: self.appId,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension Amplify.ListDomainAssociationsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Amplify.ListDomainAssociationsRequest {
        return .init(
            appId: self.appId,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension Amplify.ListJobsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Amplify.ListJobsRequest {
        return .init(
            appId: self.appId,
            branchName: self.branchName,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}
